package org.zjframework.traceframe.common.service;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletResponse;

//import jeecg.system.pojo.base.TSDepart;








import org.hibernate.Session;
import org.zjframework.traceframe.common.model.DataGrid;
import org.zjframework.traceframe.common.util.PageBean;
import org.zjframework.traceframe.common.util.PageHelper;


public interface ICommonService {

	public <T> DataGrid<T> getDataGrid(Map<String,Object> params, PageHelper pageHelper, String hql);

	/**
	 * 获取所有数据库表
	 * @return
	 */
//	public List<DBTable> getAllDbTableName();
	public Integer getAllDbTableSize();
    public  List<String> getProperty(Class entityName);
	public <T> void save(T entity);
	/**
	 * easyui拓展 将新插入的数据在datagrid的第一行显示
	 * @param entity
	 * @return
	 */
	public <T> T saveInsertRow(T entity);
	/**
	 * easyui拓展 结合easyui updateRow方法来实现修改数据
	 * @param entity
	 * @return
	 */
	public <T> T updateRow(T entity);
    public <T> T updateRow4merge(T entity);
	public <T> void saveOrUpdate(T entity);
	public <T> void delete(T entity);
	public <T> void batchSave(List<T> entitys);
	/**
	 * 根据实体名称和主键获取实体
	 *
	 * @param <T>
	 * @param entityName
	 * @param id
	 * @return
	 */
	public <T> T get(Class<T> class1, Serializable id);
	/**
	 * 根据实体名称和主键获取实体
	 *
	 * @param <T>
	 * @param entityName
	 * @param id
	 * @return
	 */
	public <T> T getEntity(Class entityName, Serializable id);
	/**
	 * 根据实体名称和字段名称和字段值获取唯一记录
	 * @param <T>
	 * @param entityClass
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public <T> T findUniqueByProperty(Class<T> entityClass, String propertyName, Object value);
	/**
	 * 按属性查找对象列表.
	 */
	public <T> List<T> findByProperty(Class<T> entityClass, String propertyName, Object value);
	/**
	 * 加载全部实体
	 * @param <T>
	 * @param entityClass
	 * @return
	 */
	public <T> List<T> loadAll(final Class<T> entityClass);


	/**
	 * 删除实体主键删除
	 *
	 * @param <T>
	 * @param entities
	 */
	public <T> void deleteEntityById(Class entityName, Serializable id);

	/**
	 * 删除实体集合
	 *
	 * @param <T>
	 * @param entities
	 */
	public <T> void deleteAllEntitie(Collection<T> entities);

	/**
	 * 更新指定的实体
	 *
	 * @param <T>
	 * @param pojo
	 */
	public <T> void updateEntitie(T pojo);

	public <T> void updateEntityById(Class entityName, Serializable id);

	/**
	 * 通过hql 查询语句查找对象
	 *
	 * @param <T>
	 * @param query
	 * @return
	 */
	public <T> List<T> findByQueryString(String hql);
	/**
	 * 根据sql更新
	 *
	 * @param query
	 * @return
	 */
	public int updateBySqlString(String sql);

	/**
	 * 根据sql查找List
	 *
	 * @param <T>
	 * @param query
	 * @return
	 */
	/*public <T> List<T> findListbySql(String query);*/
	/**
	 * 通过属性称获取实体带排序
	 *
	 * @param <T>
	 * @param clas
	 * @return
	 */
	public <T> List<T> findByPropertyisOrder(Class<T> entityClass, String propertyName, Object value, boolean isAsc);

	public <T> List<T> getList(Class clas);

	public <T> T singleResult(String hql);

//	/**
//	 *
//	 * cq方式分页
//	 *
//	 * @param cq
//	 * @param isOffset
//	 * @return
//	 */
//	public PageList getPageList(final CriteriaQuery cq, final boolean isOffset);
//	/**
//	 * 返回DataTableReturn模型
//	 * @param cq
//	 * @param isOffset
//	 * @return
//	 */
//	public DataTableReturn getDataTableReturn(final CriteriaQuery cq, final boolean isOffset);
//	/**
//	 * 返回easyui datagrid模型
//	 * @param cq
//	 * @param isOffset
//	 * @return
//	 */
//	public DataGridReturn getDataGridReturn(final CriteriaQuery cq, final boolean isOffset);
//
//
//	/**
//	 *
//	 * hqlQuery方式分页
//	 *
//	 * @param cq
//	 * @param isOffset
//	 * @return
//	 */
//	public PageList getPageList(final HqlQuery hqlQuery, final boolean needParameter);
//
//	/**
//	 *
//	 * sqlQuery方式分页
//	 *
//	 * @param cq
//	 * @param isOffset
//	 * @return
//	 */
//	public PageList getPageListBySql(final HqlQuery hqlQuery, final boolean isToEntity);
	public Session getSession();
	public List findByExample(final String entityName, final Object exampleEntity);
	/**
	 * 通过cq获取全部实体
	 *
	 * @param <T>
	 * @param cq
	 * @return
	 */
//	public <T> List<T> getListByCriteriaQuery(final CriteriaQuery cq,Boolean ispage);
	/**
	 * 文件上传
	 * @param request
	 */
//	public <T> T uploadFile(UploadFile uploadFile);
//	public HttpServletResponse viewOrDownloadFile(UploadFile uploadFile);

	/**
	 * 生成XML文件
	 * @param fileName XML全路径
	 */
//	public HttpServletResponse createXml(ImportFile importFile);
	/**
	 * 解析XML文件
	 * @param fileName XML全路径
	 */
	public void parserXml(String fileName);
//	public List<ComboTree> comTree(List<TSDepart> all,ComboTree comboTree);
	/**
	 * 根据模型生成JSON
	 * @param all 全部对象
	 * @param in  已拥有的对象
	 * @param comboBox 模型
	 * @return
	 */
//	public  List<ComboTree> ComboTree(List all,ComboTreeModel comboTreeModel, List in);
	/**
	 * 构建树形数据表
	 * @param all
	 * @param treeGridModel
	 * @return
	 */
//	public  List<TreeGrid> treegrid(List all,TreeGridModel treeGridModel);
	/**
	 * 获取自动完成列表
	 * @param <T>
	 * @return
	 */
//	public  <T> List<T> getAutoList(Autocomplete autocomplete);





	/**
	 * 执行SQL
	 */
	public Integer executeSql(String sql, List<Object> param);

	/**
	 * 执行SQL
	 */
	public Integer executeSql(String sql, Object... param);

	/**
	 * 执行HQL语句
	 * @param hql
	 * @return
	 */
	public Integer executeHql(String hql);


	/**
	 * 通过JDBC查找对象集合
	 * 使用指定的检索标准检索数据返回数据
	 */
	public List<Map<String, Object>> findForJdbc(String sql, Object... objs);


	/**
	 * 通过JDBC查找对象集合
	 * 使用指定的检索标准检索数据返回数据
	 */
	public Map<String, Object> findOneForJdbc(String sql, Object... objs);

	/**
	 * 通过JDBC查找对象集合,带分页
	 * 使用指定的检索标准检索数据并分页返回数据
	 */
	public List<Map<String, Object>> findForJdbc(String sql, int page, int rows);


	/**
	 * 通过JDBC查找对象集合,带分页
	 * 使用指定的检索标准检索数据并分页返回数据
	 */
	public <T> List<T> findObjForJdbc(String sql, int page, int rows, Class<T> clazz) ;


	/**
	 * 使用指定的检索标准检索数据并分页返回数据-采用预处理方式
	 *
	 * @param criteria
	 * @param firstResult
	 * @param maxResults
	 * @return
	 * @throws DataAccessException
	 */
	public List<Map<String, Object>> findForJdbcParam(String sql, int page, int rows, Object... objs);

	/**
	 * 使用指定的检索标准检索数据并分页返回数据For JDBC
	 */
	public Long getCountForJdbc(String sql) ;
	/**
	 * 使用指定的检索标准检索数据并分页返回数据For JDBC-采用预处理方式
	 *
	 */
	public Long getCountForJdbcParam(String sql, Object[] objs);


	/**
	 * 通过hql 查询语句查找对象
	 *
	 * @param <T>
	 * @param query
	 * @return
	 */
	public <T> List<T> findHql(String hql, Object... param) ;

	/**
	 * 通过hql Map方式查询
	 *
	 * @param <T>
	 * @param query
	 * @return
	 */
	public <T> List<T> findHql(String hql, Map<String, Object> param);

	/**
	 * dwz分页操作
	 */
	public <T> List<T> findList(String hql, String keyWord, Integer currentPage, Integer numPerPage, String orderField, String orderDirection)
			throws Exception;
	/**
	 * dwz分页统计条数操作
	 */
	/*public int getAllCount(final String hql) throws Exception;*/

	/*
	 * 普通分页统计条数操作
	 */
	public int getAllRowCount(String hql);
	/*
	 * 获取分页属性操作
	 */
	/*public PageBean queryForPage(String hql,int pageSize,int currentPage);*/

	/**
	 * easyui分页
	 */
	public <T> List<T> find(String hql, int page, int rows);

	public <T> Set<T> findSet(String hql, int page, int rows);

	/**
	 * easyui带参分页
	 */
	public <T> List<T> find(String hql, int page, int rows, Map<String, Object> param);

	/**
	 * 获取分页属性操作
	 */
	public PageBean queryForPage(String hql, int pageSize, int currentPage, Map<String, Object> param);

}
